// C++ Templates: 第13.4节 继承和类模板
// 13.4 继承和类模板
// 继承是面向对象编程的核心特性，当与模板结合时，会产生一些特殊的行为和规则。第13.4节讨论了模板类与继承之间的交互，特别是基类如何影响名称查找。

// 13.4.1 非依赖基类
// 非依赖基类是指不依赖于模板参数的基类。这种情况下，基类在模板定义时就已经确定，不会随着模板实例化而改变。

// 非依赖基类的特点
// 1.基类在模板定义时确定：
class Base
{
public:
    void foo() { std::cout << "Base::foo()" << std::endl; }
};

template <typename T>
class Derived : public Base
{ // Base是非依赖基类
public:
    void bar()
    {
        foo(); // 调用Base::foo()
    }
};

// 2.名称查找规则：
// 非依赖基类中的名称在模板定义时（第一阶段）就会被查找
// 这些名称可以在模板中直接使用，无需特殊语法

// 3.成员访问：
// 派生模板类可以直接访问非依赖基类的成员
// 不需要使用this->或类名限定

// 实际例子
class Logger
{
protected:
    void log(const std::string &message)
    {
        std::cout << "Log: " << message << std::endl;
    }
};

template <typename T>
class DataProcessor : public Logger
{ // Logger是非依赖基类
public:
    void process(const T &data)
    {
        log("Processing data"); // 直接调用Logger::log
        // 处理数据...
        log("Data processing completed");
    }
};
// 在这个例子中：
// Logger是非依赖基类，不依赖于模板参数T
// DataProcessor可以直接调用log方法，无需使用this->或Logger::前缀
// 编译器在模板定义时就能解析log调用

// 非依赖基类的优势
// 1.代码简洁：不需要额外的语法来访问基类成员
// 2.早期错误检测：如果基类成员不存在，在模板定义时就会报错，而不是等到实例化时
// 3.更好的IDE支持：IDE可以在编写代码时提供更准确的代码补全和错误检查


